package com.dragon.modules.yuegou.client.wechat_mini.client;

import com.dragon.modules.yuegou.client.wechat_mini.common.BaseResponse;
import com.dragon.modules.yuegou.client.wechat_mini.request.SubscribeMessageRequest;
import com.dragon.modules.yuegou.client.wechat_mini.request.TemplateAddRequest;
import com.dragon.modules.yuegou.client.wechat_mini.request.TemplateDeleteRequest;
import com.dragon.modules.yuegou.client.wechat_mini.request.TemplateTitleListRequest;
import com.dragon.modules.yuegou.client.wechat_mini.response.CategoryResponse;
import com.dragon.modules.yuegou.client.wechat_mini.response.KeywordsResponse;
import com.dragon.modules.yuegou.client.wechat_mini.response.TemplateIdResponse;
import com.dragon.modules.yuegou.client.wechat_mini.response.TemplateResponse;
import com.dragon.modules.yuegou.client.wechat_mini.response.TemplateTitleResponse;

/**
 * 订阅消息<br>
 * 
 * <h1>使用说明</h1>
 * <h2>步骤一：小程序后台获取模板</h2> 在微信公众平台手动配置获取模板 ID： 登录 https://mp.weixin.qq.com
 * 获取模板，如果没有合适的模板，可以申请添加新模板，审核通过后可使用。
 * 
 * <h2>步骤二：小程序端获取下发权限</h2> 小程序端调用接口向用户申请下发权限。
 * 
 * <pre>
 * <code>
 * wx.requestSubscribeMessage({
 *   tmplIds: [''],
 *   success (res) { }
 *})
 * </code>
 * </pre>
 * 
 * <h3>步骤三：服务端调用接口发送消息</h3> <code>subscribeMessageClient.send(message)</code>
 * 
 * @author liuwu
 *
 */
public interface SubscribeMessageClient {

	/**
	 * 发送订阅消息<br>
	 * 
	 * <h3>errcode 的合法值</h3>
	 * <table>
	 * <th>
	 * <td>值</td>
	 * <td>说明</td></th>
	 * <tr>
	 * <td>40003</td>
	 * <td>touser字段openid为空或者不正确</td>
	 * </tr>
	 * <tr>
	 * <td>40003</td>
	 * <td>订阅模板id为空不正确</td>
	 * </tr>
	 * <tr>
	 * <td>43101</td>
	 * <td>用户拒绝接受消息，如果用户之前曾经订阅过，则表示用户取消了订阅关系</td>
	 * </tr>
	 * <tr>
	 * <td>47003</td>
	 * <td>模板参数不准确，可能为空或者不满足规则，errmsg会提示具体是哪个字段出错</td>
	 * </tr>
	 * <tr>
	 * <td>41030</td>
	 * <td>page路径不正确，需要保证在现网版本小程序中存在，与app.json保持一致</td>
	 * </tr>
	 * </table>
	 * 
	 * @param accessToken 接口调用凭证
	 * @param message     订阅消息
	 * @return 发送结果
	 */
	BaseResponse send(String accessToken, SubscribeMessageRequest message);

	/**
	 * 添加模板到小程序账号<br>
	 * 
	 * <h3>errcode 的合法值</h3>
	 * <table>
	 * <th>
	 * <td>值</td>
	 * <td>说明</td></th>
	 * <tr>
	 * <td>200014</td>
	 * <td>模版 tid 参数错误</td>
	 * </tr>
	 * <tr>
	 * <td>200020</td>
	 * <td>关键词列表 kidList 参数错误</td>
	 * </tr>
	 * <tr>
	 * <td>200021</td>
	 * <td>场景描述 sceneDesc 参数错误</td>
	 * </tr>
	 * <tr>
	 * <td>200011</td>
	 * <td>此账号已被封禁，无法操作</td>
	 * </tr>
	 * <tr>
	 * <td>200013</td>
	 * <td>此模版已被封禁，无法选用</td>
	 * </tr>
	 * <tr>
	 * <td>200012</td>
	 * <td>个人模版数已达上限，上限25个</td>
	 * </tr>
	 * </table>
	 * 
	 * @param accessToken 接口调用凭证
	 * @param request     添加模板请求
	 * @return 添加至帐号下的模板id
	 */
	TemplateIdResponse addTemplate(String accessToken, TemplateAddRequest request);

	/**
	 * 删除账号下的模板<br>
	 * 
	 * @param accessToken 接口调用凭证
	 * @param request     模板删除请求
	 * @return 基础响应
	 */
	BaseResponse deleteTemplate(String accessToken, TemplateDeleteRequest request);

	/**
	 * 获取小程序账号的类目
	 * 
	 * @param accessToken 接口调用凭证
	 * @return 类目列表
	 */
	CategoryResponse getCategory(String accessToken);

	/**
	 * 获取模板标题下的关键词列表
	 * 
	 * @param accessToken 接口调用凭证
	 * @param tid         公用模板ID
	 * @return 关键词列表
	 */
	KeywordsResponse getPubTemplateKeyWordsById(String accessToken, Integer tid);

	/**
	 * 获取帐号所属类目下的公共模板标题
	 * 
	 * @param accessToken 接口调用凭证
	 * @param request     模板标题查询请求
	 * @return 模板标题列表
	 */
	TemplateTitleResponse getPubTemplateTitleList(String accessToken, TemplateTitleListRequest request);

	/**
	 * 获取当前帐号下的个人模板列表
	 * 
	 * @param accessToken 接口调用凭证
	 * @return 个人模板列表
	 */
	TemplateResponse getTemplateList(String accessToken);
}
